package com.springstudy.shiro.shiro.filters;

import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Shiro 提供 roles 拦截器，其验证用户拥有所有角色，没有提供验证用户拥有任意角色的拦截器。
 * 该拦截器验证用户只需要满足任一个角色就可以通过校验
 *
 * @author chenrongrong
 * @since 2020/3/12 9:08
 */
@Slf4j
public class AnyRolesFilter extends AccessControlFilter {
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        log.info(getClass().getSimpleName() + "开始校验任意角色");
        String[] roles = (String[]) o;

        //如果没有设置角色参数，默认成功
        if(roles == null) {
            return true;
        }

        Subject subject = this.getSubject(servletRequest, servletResponse);
        for(String role:roles) {
            //检查当前用户是否包含其中一个角色，如果是则返回true
            if(subject.hasRole(role)) {
                return true;
            }
        }

        //如果一个角色都不满足，则返回false，执行onAccessDenied
        return false;
    }

    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
        //执行校验失败后的操作
        log.info(getClass().getSimpleName() + "校验角色失败");

        return false;
    }
}
